package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Time;
import java.util.ArrayList;

import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.BitacoraCastigoUnidadDAO;
import mx.ipn.persistencia.dao.UnidadDAO;
import mx.ipn.persistencia.dao.MotivoDAO;
import mx.ipn.persistencia.dao.UsuarioDAO;
import mx.ipn.to.BitacoraCastigoUnidadTO;
import mx.ipn.to.UnidadTO;
import mx.ipn.to.MotivoTO;
import mx.ipn.to.UsuarioTO;
import mx.ipn.to.FechaHoraTO;;

public class BitacoraCastigoUnidadDAOMySQL implements BitacoraCastigoUnidadDAO{
	static{FabricaDeDAOsMySQL.iniciaLog(BitacoraCastigoUnidadDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO bitacora_castigo_unidad (fecha,hora,descripcion,id_motivo,id_unidad,id_usuario) VALUES(?,?,?,?,?,?)";

	private static final String UPDATE = "UPDATE bitacora_castigo_unidad SET fecha=?,hora=?,descripcion=?,id_motivo=?,id_unidad=?,id_usuario=? WHERE id_operacion=?";

	private static final String FINDBYID = "SELECT * FROM bitacora_castigo_unidad WHERE id_operacion=?";

	private static final String SELECT = "SELECT * FROM bitacora_castigo_unidad";



	private static final String SELECTBYRANGOFECHAHORA = "SELECT * FROM bitacora_castigo_unidad WHERE fecha>=? AND fecha<=? AND hora>=? AND hora<=?";

	private static final String SELECTBYRANGOFECHAUNIDAD = "SELECT * FROM bitacora_castigo_unidad WHERE fecha>=? AND fecha<=? AND id_unidad=?";

	private static final String SELECTBYRANGOFECHAMOTIVO = "SELECT * FROM bitacora_castigo_unidad WHERE fecha>=? AND fecha<=? AND id_motivo=?";

	private static final String SELECTBYRANGOFECHAUSUARIO = "SELECT * FROM bitacora_castigo_unidad WHERE fecha>=? AND fecha<=? AND id_usuario=?";

	private static final String SELECTBYRANGOFECHAMOTIVOUNIDAD = "SELECT * FROM bitacora_castigo_unidad WHERE fecha>=? AND fecha<=? AND id_motivo=? AND id_unidad=?";

	@Override
	public BitacoraCastigoUnidadTO findBitacoraCastigoUnidadById(int idOperacion) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);

			ps.setInt(1, idOperacion);

			ResultSet rs = ps.executeQuery();
			FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			UsuarioDAO usuarioDAO = fabricaMySQL.getUsuarioDAO();
			MotivoDAO motivoDAO = fabricaMySQL.getMotivoDAO();
			UnidadDAO unidadDAO = fabricaMySQL.getUnidadDAO();

			if (rs.next()) {
				idOperacion = rs.getInt("id_operacion");
				java.sql.Date fecha = rs.getDate("fecha");
				java.sql.Time hora = rs.getTime("hora");
				String descripcion = rs.getString("descripcion");

				ArrayList<MotivoTO> listMotivoTO = new ArrayList<MotivoTO>();
				ArrayList<UnidadTO> listUnidadTO = new ArrayList<UnidadTO>();
				ArrayList<UsuarioTO> listUsuarioTO = new ArrayList<UsuarioTO>();

				MotivoTO motivoTO = motivoDAO.findMotivoById(rs
						.getInt("id_motivo"));
				UnidadTO unidadTO = unidadDAO.findUnidadById(rs
						.getInt("id_unidad"));
				UsuarioTO usuarioTO = usuarioDAO.findUsuarioById(rs
						.getInt("id_usuario"));

				listMotivoTO.add(motivoTO);
				listUnidadTO.add(unidadTO);
				listUsuarioTO.add(usuarioTO);

				UsuarioTO[] arrUsuarioTO = (UsuarioTO[])listUsuarioTO.toArray(new UsuarioTO[listUsuarioTO.size()]);
				UnidadTO[] arrUnidadTO = (UnidadTO[])listUnidadTO.toArray(new UnidadTO[listUnidadTO.size()]);				
				MotivoTO[] arrMotivoTO = (MotivoTO[])listMotivoTO.toArray(new MotivoTO[listMotivoTO.size()]);
				
				BitacoraCastigoUnidadTO bitacoraCastigoUnidadTO = new BitacoraCastigoUnidadTO(
						idOperacion, fecha, hora, descripcion, arrMotivoTO,
						arrUnidadTO, arrUsuarioTO);
				ps.close();
				conexion.close();
				return bitacoraCastigoUnidadTO;
			}
			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public boolean insertBitacoraCastigoUnidad(
			BitacoraCastigoUnidadTO bitacoraCastigoUnidadTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setDate(1, FechaHoraTO.getFecha(bitacoraCastigoUnidadTO.getFecha()));
			ps.setTime(2, FechaHoraTO.getHora(bitacoraCastigoUnidadTO.getHora()));
			ps.setString(3, bitacoraCastigoUnidadTO.getDescripcion());
			ps.setInt(4, bitacoraCastigoUnidadTO.getIdMotivo());
			ps.setInt(5, bitacoraCastigoUnidadTO.getIdUnidad());
			ps.setInt(6, bitacoraCastigoUnidadTO.getIdUsuario());

			ps.executeUpdate();

			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	@Override
	public ArrayList<BitacoraCastigoUnidadTO> selectBitacoraCastigoUnidad() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();
			FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

			MotivoDAO motivoDAO = fabricaMySQL.getMotivoDAO();
			UnidadDAO unidadDAO = fabricaMySQL.getUnidadDAO();
			UsuarioDAO usuarioDAO = fabricaMySQL.getUsuarioDAO();

			ArrayList<BitacoraCastigoUnidadTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<BitacoraCastigoUnidadTO>();

				int idOperacion = rs.getInt("id_operacion");
				java.sql.Date fecha = rs.getDate("fecha");
				java.sql.Time hora = rs.getTime("hora");
				String descripcion = rs.getString("descripcion");

				ArrayList<MotivoTO> listMotivoTO = new ArrayList<MotivoTO>();
				ArrayList<UnidadTO> listUnidadTO = new ArrayList<UnidadTO>();
				ArrayList<UsuarioTO> listUsuarioTO = new ArrayList<UsuarioTO>();

				MotivoTO motivoTO = motivoDAO.findMotivoById(rs
						.getInt("id_motivo"));
				UnidadTO unidadTO = unidadDAO.findUnidadById(rs
						.getInt("id_unidad"));
				UsuarioTO usuarioTO = usuarioDAO.findUsuarioById(rs
						.getInt("id_usuario"));

				listMotivoTO.add(motivoTO);
				listUnidadTO.add(unidadTO);
				listUsuarioTO.add(usuarioTO);

				UsuarioTO[] arrUsuarioTO = (UsuarioTO[])listUsuarioTO.toArray(new UsuarioTO[listUsuarioTO.size()]);
				UnidadTO[] arrUnidadTO = (UnidadTO[])listUnidadTO.toArray(new UnidadTO[listUnidadTO.size()]);				
				MotivoTO[] arrMotivoTO = (MotivoTO[])listMotivoTO.toArray(new MotivoTO[listMotivoTO.size()]);
				
				BitacoraCastigoUnidadTO bitacoraCastigoUnidadTO = new BitacoraCastigoUnidadTO(
						idOperacion, fecha, hora, descripcion, arrMotivoTO,
						arrUnidadTO, arrUsuarioTO);

				coleccion.add(bitacoraCastigoUnidadTO);
			}
			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<BitacoraCastigoUnidadTO> selectByRangoFechaHora(
			Date inicioFecha,Date finFecha, Time inicio, Time fin) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYRANGOFECHAHORA);

			ps.setDate(1, inicioFecha);
			ps.setDate(2, finFecha);
			ps.setTime(3, inicio);
			ps.setTime(4, fin);

			ResultSet rs = ps.executeQuery();
			FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

			MotivoDAO motivoDAO = fabricaMySQL.getMotivoDAO();
			UnidadDAO unidadDAO = fabricaMySQL.getUnidadDAO();
			UsuarioDAO usuarioDAO = fabricaMySQL.getUsuarioDAO();

			ArrayList<BitacoraCastigoUnidadTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<BitacoraCastigoUnidadTO>();

				int idOperacion = rs.getInt("id_operacion");
				java.sql.Date fecha = rs.getDate("fecha"); 
				java.sql.Time hora = rs.getTime("hora");
				String descripcion = rs.getString("descripcion");

				ArrayList<MotivoTO> listMotivoTO = new ArrayList<MotivoTO>();
				ArrayList<UnidadTO> listUnidadTO = new ArrayList<UnidadTO>();
				ArrayList<UsuarioTO> listUsuarioTO = new ArrayList<UsuarioTO>();

				MotivoTO motivoTO = motivoDAO.findMotivoById(rs
						.getInt("id_motivo"));
				UnidadTO unidadTO = unidadDAO.findUnidadById(rs
						.getInt("id_unidad"));
				UsuarioTO usuarioTO = usuarioDAO.findUsuarioById(rs
						.getInt("id_usuario"));

				listMotivoTO.add(motivoTO);
				listUnidadTO.add(unidadTO);
				listUsuarioTO.add(usuarioTO);

				UsuarioTO[] arrUsuarioTO = (UsuarioTO[])listUsuarioTO.toArray(new UsuarioTO[listUsuarioTO.size()]);
				UnidadTO[] arrUnidadTO = (UnidadTO[])listUnidadTO.toArray(new UnidadTO[listUnidadTO.size()]);				
				MotivoTO[] arrMotivoTO = (MotivoTO[])listMotivoTO.toArray(new MotivoTO[listMotivoTO.size()]);
				
				BitacoraCastigoUnidadTO bitacoraCastigoUnidadTO = new BitacoraCastigoUnidadTO(
						idOperacion, fecha, hora, descripcion, arrMotivoTO,
						arrUnidadTO, arrUsuarioTO);

				coleccion.add(bitacoraCastigoUnidadTO);
			}
			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	@Override
	public BitacoraCastigoUnidadTO selectByRangoFechaMotivo(Date inicioFecha,
			Date finFecha, int idMotivo) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;
			

			MotivoDAO motivoDAO = null;
			UnidadDAO unidadDAO = null;
			UsuarioDAO usuarioDAO = null;

			ArrayList<Integer> listIdOperacion = null;
			ArrayList<java.sql.Date> listFecha = null;
			ArrayList<java.sql.Time> listHora = null;
			ArrayList<String> listDescripcion = null;
			ArrayList<MotivoTO> listMotivoTO = null;
			ArrayList<UnidadTO> listUnidadTO = null;
			ArrayList<UsuarioTO> listUsuarioTO = null;

			BitacoraCastigoUnidadTO bitacoraCastigoUnidadTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYRANGOFECHAMOTIVO);
			ps.setDate(1, inicioFecha);
			ps.setDate(2, finFecha);
			ps.setInt(3, idMotivo);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdOperacion == null) {

					listIdOperacion = new ArrayList<Integer>();
					listFecha = new ArrayList<java.sql.Date>();
					listHora = new ArrayList<java.sql.Time>();
					listDescripcion = new ArrayList<String>();
					listMotivoTO = new ArrayList<MotivoTO>();
					listUnidadTO = new ArrayList<UnidadTO>();
					listUsuarioTO = new ArrayList<UsuarioTO>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					motivoDAO = fabricaMySQL.getMotivoDAO();
					unidadDAO = fabricaMySQL.getUnidadDAO();
					usuarioDAO = fabricaMySQL.getUsuarioDAO();

				}
				listIdOperacion.add(rs.getInt("id_operacion"));
				listFecha.add(rs.getDate("fecha"));
				listHora.add(rs.getTime("hora"));
				listDescripcion.add(rs.getString("descripcion"));
				listUnidadTO.add(unidadDAO.findUnidadById(rs
						.getInt("id_unidad")));
				listUsuarioTO.add(usuarioDAO.findUsuarioById(rs
						.getInt("id_usuario")));
			}
			if (listIdOperacion != null) {
				listMotivoTO.add(motivoDAO.findMotivoById(idMotivo));
				
				UsuarioTO[] arrUsuarioTO = (UsuarioTO[])listUsuarioTO.toArray(new UsuarioTO[listUsuarioTO.size()]);
				UnidadTO[] arrUnidadTO = (UnidadTO[])listUnidadTO.toArray(new UnidadTO[listUnidadTO.size()]);				
				MotivoTO[] arrMotivoTO = (MotivoTO[])listMotivoTO.toArray(new MotivoTO[listMotivoTO.size()]);
				Integer[] arrIdOperacion = (Integer[])listIdOperacion.toArray(new Integer[listIdOperacion.size()]);
				Date[] arrFecha = (Date[])listFecha.toArray(new Date[listFecha.size()]);
				String[] arrDescripcion = (String[])listDescripcion.toArray(new String[listDescripcion.size()]);
				Time[] arrHora = (Time[])listHora.toArray(new Time[listHora.size()]);
				
				bitacoraCastigoUnidadTO = new BitacoraCastigoUnidadTO(
						arrIdOperacion, arrFecha, arrHora, arrDescripcion,
						arrMotivoTO, arrUnidadTO, arrUsuarioTO);
			}
			ps.close();
			conexion.close();
			return bitacoraCastigoUnidadTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public BitacoraCastigoUnidadTO selectByRangoFechaMotivoUnidad(
			Date inicioFecha, Date finFecha, int idMotivo, int idUnidad) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;

			MotivoDAO motivoDAO = null;
			UnidadDAO unidadDAO = null;
			UsuarioDAO usuarioDAO = null;

			ArrayList<Integer> listIdOperacion = null;
			ArrayList<java.sql.Date> listFecha = null;
			ArrayList<java.sql.Time> listHora = null;
			ArrayList<String> listDescripcion = null;
			ArrayList<MotivoTO> listMotivoTO = null;
			ArrayList<UnidadTO> listUnidadTO = null;
			ArrayList<UsuarioTO> listUsuarioTO = null;

			BitacoraCastigoUnidadTO bitacoraCastigoUnidadTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYRANGOFECHAMOTIVOUNIDAD);
			ps.setDate(1, inicioFecha);
			ps.setDate(2, finFecha);
			ps.setInt(3, idMotivo);
			ps.setInt(4, idUnidad);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdOperacion == null) {

					listIdOperacion = new ArrayList<Integer>();
					listFecha = new ArrayList<java.sql.Date>();
					listHora = new ArrayList<java.sql.Time>();
					listDescripcion = new ArrayList<String>();
					listMotivoTO = new ArrayList<MotivoTO>();
					listUnidadTO = new ArrayList<UnidadTO>();
					listUsuarioTO = new ArrayList<UsuarioTO>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					motivoDAO = fabricaMySQL.getMotivoDAO();
					unidadDAO = fabricaMySQL.getUnidadDAO();
					usuarioDAO = fabricaMySQL.getUsuarioDAO();

				}
				listIdOperacion.add(rs.getInt("id_operacion"));
				listFecha.add(rs.getDate("fecha"));
				listHora.add(rs.getTime("hora"));
				listDescripcion.add(rs.getString("descripcion"));

				listUsuarioTO.add(usuarioDAO.findUsuarioById(rs
						.getInt("id_usuario")));
			}
			if (listIdOperacion != null) {
				listMotivoTO.add(motivoDAO.findMotivoById(idMotivo));
				listUnidadTO.add(unidadDAO.findUnidadById(idUnidad));

				UsuarioTO[] arrUsuarioTO = (UsuarioTO[])listUsuarioTO.toArray(new UsuarioTO[listUsuarioTO.size()]);
				UnidadTO[] arrUnidadTO = (UnidadTO[])listUnidadTO.toArray(new UnidadTO[listUnidadTO.size()]);				
				MotivoTO[] arrMotivoTO = (MotivoTO[])listMotivoTO.toArray(new MotivoTO[listMotivoTO.size()]);
				Integer[] arrIdOperacion = (Integer[])listIdOperacion.toArray(new Integer[listIdOperacion.size()]);
				Date[] arrFecha = (Date[])listFecha.toArray(new Date[listFecha.size()]);
				String[] arrDescripcion = (String[])listDescripcion.toArray(new String[listDescripcion.size()]);
				Time[] arrHora = (Time[])listHora.toArray(new Time[listHora.size()]);
				
				bitacoraCastigoUnidadTO = new BitacoraCastigoUnidadTO(
						arrIdOperacion, arrFecha, arrHora, arrDescripcion,
						arrMotivoTO, arrUnidadTO, arrUsuarioTO);
			}
			ps.close();
			conexion.close();
			return bitacoraCastigoUnidadTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public BitacoraCastigoUnidadTO selectByRangoFechaUnidad(Date inicioFecha,
			Date finFecha, int idUnidad) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			
			FabricaDeDAOs fabricaMySQL = null;

			MotivoDAO motivoDAO = null;
			UnidadDAO unidadDAO = null;
			UsuarioDAO usuarioDAO = null;

			ArrayList<Integer> listIdOperacion = null;
			ArrayList<java.sql.Date> listFecha = null;
			ArrayList<java.sql.Time> listHora = null;
			ArrayList<String> listDescripcion = null;
			ArrayList<MotivoTO> listMotivoTO = null;
			ArrayList<UnidadTO> listUnidadTO = null;
			ArrayList<UsuarioTO> listUsuarioTO = null;

			BitacoraCastigoUnidadTO bitacoraCastigoUnidadTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYRANGOFECHAUNIDAD);
			ps.setDate(1, inicioFecha);
			ps.setDate(2, finFecha);
			ps.setInt(3, idUnidad);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdOperacion == null) {

					listIdOperacion = new ArrayList<Integer>();
					listFecha = new ArrayList<java.sql.Date>();
					listHora = new ArrayList<java.sql.Time>();
					listDescripcion = new ArrayList<String>();
					listMotivoTO = new ArrayList<MotivoTO>();
					listUnidadTO = new ArrayList<UnidadTO>();
					listUsuarioTO = new ArrayList<UsuarioTO>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					motivoDAO = fabricaMySQL.getMotivoDAO();
					unidadDAO = fabricaMySQL.getUnidadDAO();
					usuarioDAO = fabricaMySQL.getUsuarioDAO();

				}
				listIdOperacion.add(rs.getInt("id_operacion"));
				listFecha.add(rs.getDate("fecha"));
				listHora.add(rs.getTime("hora"));
				listDescripcion.add(rs.getString("descripcion"));
				listMotivoTO.add(motivoDAO.findMotivoById(rs
						.getInt("id_motivo")));
				listUsuarioTO.add(usuarioDAO.findUsuarioById(rs
						.getInt("id_usuario")));
			}
			if (listIdOperacion != null) {
				listUnidadTO.add(unidadDAO.findUnidadById(idUnidad));

				UsuarioTO[] arrUsuarioTO = (UsuarioTO[])listUsuarioTO.toArray(new UsuarioTO[listUsuarioTO.size()]);
				UnidadTO[] arrUnidadTO = (UnidadTO[])listUnidadTO.toArray(new UnidadTO[listUnidadTO.size()]);				
				MotivoTO[] arrMotivoTO = (MotivoTO[])listMotivoTO.toArray(new MotivoTO[listMotivoTO.size()]);
				Integer[] arrIdOperacion = (Integer[])listIdOperacion.toArray(new Integer[listIdOperacion.size()]);
				Date[] arrFecha = (Date[])listFecha.toArray(new Date[listFecha.size()]);
				String[] arrDescripcion = (String[])listDescripcion.toArray(new String[listDescripcion.size()]);
				Time[] arrHora = (Time[])listHora.toArray(new Time[listHora.size()]);
				
				bitacoraCastigoUnidadTO = new BitacoraCastigoUnidadTO(
						arrIdOperacion, arrFecha, arrHora, arrDescripcion,
						arrMotivoTO, arrUnidadTO, arrUsuarioTO);
			}
			ps.close();
			conexion.close();
			return bitacoraCastigoUnidadTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public BitacoraCastigoUnidadTO selectByRangoFechaUsuario(Date inicioFecha,
			Date finFecha, int idUsuario) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
		
			FabricaDeDAOs fabricaMySQL = null;

			MotivoDAO motivoDAO = null;
			UnidadDAO unidadDAO = null;
			UsuarioDAO usuarioDAO = null;

			ArrayList<Integer> listIdOperacion = null;
			ArrayList<java.sql.Date> listFecha = null;
			ArrayList<java.sql.Time> listHora = null;
			ArrayList<String> listDescripcion = null;
			ArrayList<MotivoTO> listMotivoTO = null;
			ArrayList<UnidadTO> listUnidadTO = null;
			ArrayList<UsuarioTO> listUsuarioTO = null;

			BitacoraCastigoUnidadTO bitacoraCastigoUnidadTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYRANGOFECHAUSUARIO);
			ps.setDate(1, inicioFecha);
			ps.setDate(2, finFecha);
			ps.setInt(3, idUsuario);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdOperacion == null) {

					listIdOperacion = new ArrayList<Integer>();
					listFecha = new ArrayList<java.sql.Date>();
					listHora = new ArrayList<java.sql.Time>();
					listDescripcion = new ArrayList<String>();
					listMotivoTO = new ArrayList<MotivoTO>();
					listUnidadTO = new ArrayList<UnidadTO>();
					listUsuarioTO = new ArrayList<UsuarioTO>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					motivoDAO = fabricaMySQL.getMotivoDAO();
					unidadDAO = fabricaMySQL.getUnidadDAO();
					usuarioDAO = fabricaMySQL.getUsuarioDAO();

				}
				listIdOperacion.add(rs.getInt("id_operacion"));
				listFecha.add(rs.getDate("fecha"));
				listHora.add(rs.getTime("hora"));
				listDescripcion.add(rs.getString("descripcion"));
				listMotivoTO.add(motivoDAO.findMotivoById(rs
						.getInt("id_motivo")));
				listUnidadTO.add(unidadDAO.findUnidadById(rs
						.getInt("id_unidad")));
			}
			if (listIdOperacion != null) {
				listUsuarioTO.add(usuarioDAO.findUsuarioById(idUsuario));

				UsuarioTO[] arrUsuarioTO = (UsuarioTO[])listUsuarioTO.toArray(new UsuarioTO[listUsuarioTO.size()]);
				UnidadTO[] arrUnidadTO = (UnidadTO[])listUnidadTO.toArray(new UnidadTO[listUnidadTO.size()]);				
				MotivoTO[] arrMotivoTO = (MotivoTO[])listMotivoTO.toArray(new MotivoTO[listMotivoTO.size()]);
				Integer[] arrIdOperacion = (Integer[])listIdOperacion.toArray(new Integer[listIdOperacion.size()]);
				Date[] arrFecha = (Date[])listFecha.toArray(new Date[listFecha.size()]);
				String[] arrDescripcion = (String[])listDescripcion.toArray(new String[listDescripcion.size()]);
				Time[] arrHora = (Time[])listHora.toArray(new Time[listHora.size()]);
				
				bitacoraCastigoUnidadTO = new BitacoraCastigoUnidadTO(
						arrIdOperacion, arrFecha, arrHora, arrDescripcion,
						arrMotivoTO, arrUnidadTO, arrUsuarioTO);
			}
			ps.close();
			conexion.close();
			return bitacoraCastigoUnidadTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public short updateBitacoraCastigoUnidad(
			BitacoraCastigoUnidadTO bitacoraCastigoUnidadTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);
			
			ps.setDate(1, FechaHoraTO.getFecha(bitacoraCastigoUnidadTO.getFecha()));
			ps.setTime(2, FechaHoraTO.getHora(bitacoraCastigoUnidadTO.getHora()));
			ps.setString(3, bitacoraCastigoUnidadTO.getDescripcion());
			ps.setInt(4, bitacoraCastigoUnidadTO.getIdMotivo());
			ps.setInt(5, bitacoraCastigoUnidadTO.getIdUnidad());
			ps.setInt(6, bitacoraCastigoUnidadTO.getIdUsuario());
			
			ps.setInt(7, bitacoraCastigoUnidadTO.getIdOperacion());

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

	
}
